1、消息队列
	消息队列是内核中的一个消息链表，它可以用于进程之间传递数据包。
2、msgget
	创建消息队列
	key: 用于区分不同消息队列的key值，为IPC_PRIVATE则始终创建新的消息队列
	msgflg: 创建标志和属性
		IPC_CREAT 不存在则创建
		O_EXCL 与IPC_CREAT一起使用，存在则报错
	成功返回消息队列标识符，失败返回-1
	int msgget(key_t key, int msgflg);
3、msgsnd
	发送消息队列
	msqid: 消息队列标识符
	msgp: 消息内容，它应该指向如下结构体
		struct msgbuf {
			long mtype;   	/* 消息类型，必须大于0 */
			char mtext[];	/* 消息数据 */
		};
	msgsz: 消息数据的大小
	msgflg: 发送标识，IPC_NOWAIT 非阻塞式
	成功返回0，失败返回-1
	int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
4、msgrcv
	获取消息队列
	msqid: 消息队列标识符
	msgp: 缓存消息内容，它应该指向如下结构体
		struct msgbuf {
			long mtype;   	/* 消息类型，必须大于0 */
			char mtext[];	/* 消息数据 */
		};
	msgtyp: 消息类型，>0接收指定类型的消息，==0接收任意类型的消息，<0接收类型小于或等于|msgtyp|的最小的一个消息
	msgflg: 接收标识，IPC_NOWAIT 非阻塞式
	成功返回消息的有长度，失败返回-1
	ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
5、msgctl
	控制消息队列
	msqid: 消息队列标识符
	cmd: 控制命令
		IPC_STAT 拷贝内核中的消息队列数据结构
		IPC_SET 设置内核中的消息队列数据结构
		IPC_RMID 删除消息队列
	buf: 配合cmd使用
		struct ipc_perm {
			key_t          __key;       /* Key supplied to msgget(2) */
			uid_t          uid;         /* Effective UID of owner */
			gid_t          gid;         /* Effective GID of owner */
			uid_t          cuid;        /* Effective UID of creator */
			gid_t          cgid;        /* Effective GID of creator */
			unsigned short mode;        /* Permissions */
			unsigned short __seq;       /* Sequence number */
		};
		struct msqid_ds {
			struct ipc_perm msg_perm;     /* Ownership and permissions */
			time_t          msg_stime;    /* Time of last msgsnd(2) */
			time_t          msg_rtime;    /* Time of last msgrcv(2) */
			time_t          msg_ctime;    /* Time of last change */
			unsigned long   __msg_cbytes; /* Current number of bytes in
											queue (nonstandard) */
			msgqnum_t       msg_qnum;     /* Current number of messages
											in queue */
			msglen_t        msg_qbytes;   /* Maximum number of bytes
											allowed in queue */
			pid_t           msg_lspid;    /* PID of last msgsnd(2) */
			pid_t           msg_lrpid;    /* PID of last msgrcv(2) */
		};
	成功返回值由cmd决定，失败返回-1
	int msgctl(int msqid, int cmd, struct msqid_ds *buf);